home *** CD-ROM | disk | FTP | other *** search
- Program MakeBold;
-
- {$B+}
- {$V-}
-
- const
- MaxChar = 255;
-
- type
- DoubIntg = array[1..2] of Integer;
- String80 = String[80];
- tRegs = record case boolean of
- false: (Ax,Bx,Cx,Dx,Bp,Si,Di,Ds,Es,Flags: Integer);
- true: (Al,Ah,Bl,Bh,Cl,Ch,Dl,Dh: Byte);
- end;
-
- tFontHdr = record
- C26: Integer;
- CNull1: Byte;
- FontType: Byte;
- CNull2: Integer;
- BaseLine: Integer;
- Width: Integer;
- Height: Integer;
- Orient: Byte;
- Fixed: Byte;
- SymSet: Integer;
- Pitch: Integer;
- Points: Integer;
- CNull3: Integer;
- CNull4: Byte;
- Style: Byte;
- Weight: Byte;
- TypeFace: Byte;
- end;
-
- tCharHdr = record
- C4: Byte;
- CNull1: Byte;
- C14: Byte;
- C1: Byte;
- Orient: Byte;
- CNull2: Byte;
- LeftOffset: Integer;
- TopOffset: Integer;
- CWidth: Integer;
- CHeight: Integer;
- DeltaX: Integer;
- end;
-
- tCRow = array[0..63] of byte;
- tChar = array[0..255] of tCRow;
-
- tBits = array[0..32767] of byte;
- tpBits = ^tBits;
-
- tCharEnt = record
- ChNbr: Byte;
- Orient: Byte;
- LeftOffset: Integer;
- TopOffset: Integer;
- CWidth: Integer;
- CHeight: Integer;
- DeltaX: Integer;
- CharLen: Integer;
- CharPtr: tpBits;
- end;
- tFont = record
- FontType: Byte;
- BaseLine: Integer;
- Width: Integer;
- Height: Integer;
- Orient: Byte;
- Fixed: Byte;
- SymSet: Integer;
- Pitch: Integer;
- Points: Integer;
- Style: Byte;
- Weight: Byte;
- TypeFace: Byte;
- Chars: array[0..MaxChar] of tCharEnt;
- end;
- tpFont = ^tFont;
-
- tFName = String[40];
-
- tMasks = array[0..7] of byte;
-
- const
- DefRegs: tRegs = (Ax:0;Bx:0;Cx:0;Dx:0;Bp:0;Si:0;Di:0;Ds:0;Es:0;Flags:0);
- Masks: tMasks = ($80,$40,$20,$10,8,4,2,1);
-
- var
- FFile: Integer;
- FFName: tFName;
- FLen: DoubIntg;
- FPos: DoubIntg;
-
- Font: tpFont;
-
- MinCn: Byte;
- MaxCn: Byte;
-
- ChBits: tChar;
- LChBits: tChar;
-
- Ch: Char;
-
- function GEDoubIntg(
- V1: DoubIntg;
- V2: DoubIntg): Boolean;
-
- var
- Result: Boolean;
-
- begin {GEDoubIntg}
-
- if v1[1]>v2[1] then
- Result:=true
- else if v1[1]<v2[1] then
- Result:=false
- else if (v1[2]<0) and (v2[2]>=0) then
- Result:=true
- else if (v1[2]>=0) and (v2[2]<0) then
- Result:=false
- else
- Result:= V1[2]>=V2[2];
-
- GEDoubIntg:=Result;
-
- end {GEDoubIntg};
-
- procedure AddDoubIntg(
- var V: DoubIntg;
- Offset: Integer);
-
- var
- P1: Integer;
- P2: Integer;
-
- begin {AddDoubIntg}
-
- P1:=V[2] and $FF;
- P2:=V[2] shr 8;
-
- P1:=P1+Offset;
-
- P2:=P2+ (P1 shr 8);
- P1:=P1 and $FF;
-
- V[1]:=V[1] + (P2 shr 8);
- P2:=P2 and $FF;
- V[2]:=(P2 shl 8) + P1;
-
- end {AddDoubIntg};
-
- procedure CloseFont(
- var FNbr: Integer);
-
- var
- Regs: tRegs;
-
- begin {CloseFont}
-
- if FNbr<>0 then
- begin
- Regs:=DefRegs;
- Regs.Ah:=$3E;
- Regs.Bx:=FNbr;
- MsDos(Regs);
- end;
-
- FNbr:=0;
-
- end {CloseFont};
-
- procedure OpenFont(
- Create: Boolean;
- Name: tFName;
- var FNbr: Integer;
- var FLen: DoubIntg;
- var Error: Integer);
-
- var
- Regs: tRegs;
-
- begin {OpenFont}
-
- Error:=0;
-
- if FNbr<>0 then
- CloseFont(FNbr);
-
- Name[ord(Name[0])+1]:=#0;
- Regs:=DefRegs;
- if Create then
- begin
- Regs.Ax:=$3C00;
- Regs.Cx:=32;
- end
- else
- Regs.Ax:=$3D00;
- Regs.Ds:=Seg(Name[1]);
- Regs.Dx:=Ofs(Name[1]);
- MsDos(Regs);
- if odd(Regs.Flags) then
- begin
- Error:=Regs.Ax;
- Regs.Ax:=0;
- end;
- FNbr:=Regs.Ax;
-
- if not Create and (Error=0) then
- begin
- Regs.Ah:=$42;
- Regs.Al:=2;
- Regs.Bx:=FNbr;
- Regs.Cx:=0;
- Regs.Dx:=0;
- MsDos(Regs);
- FLen[1]:=Regs.Dx;
- FLen[2]:=Regs.Ax;
- end;
-
-
- end {OpenFont};
-
- procedure MoveFromFont(
- Nbr: Integer;
- FirstByte: DoubIntg;
- var Dest;
- Len: Integer);
-
- var
- Regs: tRegs;
-
- begin {MoveFromFont}
-
- Regs:=DefRegs;
- with Regs do
- begin
- Ax:=$4200;
- Bx:=Nbr;
- Cx:=FirstByte[1];
- Dx:=FirstByte[2];
- end;
- MsDos(Regs);
-
- Regs:=DefRegs;
- with Regs do
- begin
- Ax:=$3F00;
- Bx:=Nbr;
- Cx:=Len;
- Dx:=Ofs(Dest);
- Ds:=Seg(Dest);
- end;
- MsDos(Regs);
-
- end {MoveFromFont};
-
- procedure MoveToFont(
- Nbr: Integer;
- var Src;
- Len: Integer);
-
- var
- Regs: tRegs;
-
- begin {MoveToFont}
-
- Regs:=DefRegs;
- with Regs do
- begin
- Ax:=$4000;
- Bx:=Nbr;
- Cx:=Len;
- Dx:=Ofs(Src);
- Ds:=Seg(Src);
- end;
- MsDos(Regs);
-
- end {MoveToFont};
-
- procedure GetFontNameAndOpen(
- LabelStr: String80;
- Create: Boolean;
- var FontName: tFName;
- var FontFile: Integer;
- var FLen: DoubIntg);
-
- var
- IoStatus: Integer;
- DumbFile: File;
-
- begin {GetFontNameAndOpen}
-
- repeat
- FontFile:=0;
- FontName:='';
- write(trm,LabelStr);
- readln(trm,fontname);
- if length(fontname)>0 then
- begin
- if Create then
- begin
- Assign(DumbFile,FontName);
- {$I-} Erase(DumbFile); {$I+}
- IoStatus:=IoResult;
- end;
- OpenFont(create,FontName,FontFile,FLen,IoStatus);
- if iostatus<>0 then
- begin
- writeln(trm,^G'Open Error ',IoStatus:1);
- read(kbd,ch);
- if (Ch=^C) then
- Halt;
- end;
- end
- else
- write(trm,^G);
-
- until IoStatus=0;
-
- end {GetFontNameAndOpen};
-
- procedure GetNumber(
- var Num: Integer;
- var Ch: Char);
-
- begin
-
- num:=0;
- repeat
- MoveFromFont(FFile,fpos,ch,1);
- if (Ch>='0') and (Ch<='9') then
- begin
- num:=10*num+(ord(ch)-48);
- adddoubintg(fpos,1);
- end;
- until (Ch<'0') or (Ch>'9');
-
- end;
-
- procedure GetFontHeader(
- var FontHdr: tFontHdr);
-
- var
- Str: String[3];
- Num: Integer;
- Ch: Char;
-
- begin
-
- MoveFromFont(FFile,fpos,str[1],3);
- str[0]:=#3;
- if str=^[')s' then
- begin
- AddDoubIntg(FPos,3);
- GetNumber(Num,Ch);
- AddDoubIntg(FPos,1);
- MoveFromFont(FFile,FPos,FontHdr,26);
- AddDoubIntg(FPos,Num);
- end;
-
- end;
-
- procedure GetCharId(
- var Cn: Byte);
-
- var
- Str: String[3];
- Ch: Char;
- Num: Integer;
-
- begin
-
- MoveFromFont(FFile,fpos,str[1],3);
- str[0]:=#3;
- if str=^['*c' then
- begin
- AddDoubIntg(FPos,3);
- GetNumber(Num,Ch);
- Cn:=Num;
- AddDoubIntg(FPos,1);
- end;
-
- end;
-
- procedure GetCharDef(
- var CharHdr: tCharHdr;
- var CharLen: Integer);
-
- var
- Str: String[3];
- Ch: Char;
- Num: Integer;
-
- begin
-
- MoveFromFont(FFile,fpos,str[1],3);
- str[0]:=#3;
- if str=^['(s' then
- begin
- AddDoubIntg(FPos,3);
- GetNumber(Num,Ch);
- AddDoubIntg(FPos,1);
- MoveFromFont(FFile,fpos,charhdr,16);
- CharLen:=Num-16;
- AddDoubIntg(FPos,16);
- end;
-
- end;
-
- procedure ReadFont;
-
- var
- Ch: Char;
- Cn: Byte;
- FontHdr: tFontHdr;
- CharHdr: tCharHdr;
- RowWidth: Integer;
- CharSize0: Integer;
- CharSize: Integer;
- Ix: Integer;
- X: Byte;
-
- begin {ReadFont}
-
- for cn:=0 to maxchar do
- Font^.Chars[Cn].ChNbr:=0;
-
- GetFontNameAndOpen('Read Font: ',false,Ffname,FFile,FLen);
- FPos[1]:=0;
- FPos[2]:=0;
-
- if FFile>0 then
- begin
- GetFontHeader(FontHdr);
- Font^.FontType:=FontHdr.FontType;
- Font^.BaseLine:=swap(FontHdr.BaseLine);
- Font^.Width:=swap(FontHdr.Width);
- Font^.Height:=swap(FontHdr.Height);
- Font^.Orient:=FontHdr.Orient;
- Font^.Fixed:=FontHdr.Fixed;
- Font^.SymSet:=swap(FontHdr.SymSet);
- Font^.Pitch:=swap(FontHdr.Pitch);
- Font^.Points:=swap(FontHdr.Points);
- Font^.Style:=FontHdr.Style;
- Font^.Weight:=FontHdr.Weight;
- Font^.TypeFace:=FontHdr.TypeFace;
-
- mincn:=255;
- maxcn:=0;
-
- while not GEDoubIntg(FPos,FLen) do
- begin
- GetCharId(Cn);
- GetCharDef(CharHdr,CharSize0);
- if cn<mincn then
- mincn:=cn;
- if cn>maxcn then
- maxcn:=cn;
- write(trm,^M^['K',cn:1);
- with Font^.Chars[cn] do
- begin
- ChNbr:=Cn;
- Orient:=CharHdr.Orient;
- LeftOffset:=swap(CharHdr.LeftOffset);
- TopOffset:=swap(CharHdr.TopOffset);
- CWidth:=swap(CharHdr.CWidth);
- CHeight:=swap(CharHdr.CHeight);
- DeltaX:=swap(CharHdr.DeltaX) div 4;
- RowWidth:=(CWidth+7) shr 3; {width in bytes}
- CharSize:=RowWidth*CHeight;
- CharLen:=CharSize;
- GetMem(CharPtr,CharSize);
- MoveFromFont(FFile,FPos,CharPtr^,CharSize);
- AddDoubIntg(FPos,CharSize);
- end;
- X:=0;
- while (X=0) and not GEDoubIntg(FPos,FLen) do
- begin
- MoveFromFont(FFile,FPos,X,1);
- if X=0 then
- AddDoubIntg(FPos,1);
- end;
- end;
-
- CloseFont(FFile);
- end;
- writeln(trm);
-
- end {ReadFont};
-
- procedure WriteFont;
-
- var
- Ch: Char;
- Cn: Byte;
- R: Byte;
- NChars: Byte;
- WFName: tFName;
- FFile: Integer;
- IoStatus: Integer;
- ErrStr: String[5];
- NumStr: String[5];
- WString: String80;
- FLen: DoubIntg;
- FPos: DoubIntg;
- FontHdr: tFontHdr;
- CharHdr: tCharHdr;
- Regs: tRegs;
-
- begin {WriteFont}
-
- GetFontNameAndOpen('Write Font: ',true,WFName,FFile,FLen);
-
- if FFile>0 then
- begin
- FontHdr.C26:=64 shl 8;
- FontHdr.CNull1:=0;
- FontHdr.CNull2:=0;
- FontHdr.CNull3:=0;
- FontHdr.CNull4:=0;
-
- FontHdr.FontType:=Font^.FontType;
- FontHdr.BaseLine:=swap(Font^.BaseLine);
- FontHdr.Width:=swap(Font^.Width);
- FontHdr.Height:=swap(Font^.Height);
- FontHdr.Orient:=Font^.Orient;
- FontHdr.Fixed:=Font^.Fixed;
- FontHdr.SymSet:=swap(Font^.SymSet);
- FontHdr.Pitch:=swap(Font^.Pitch);
- FontHdr.Points:=swap(Font^.Points);
- FontHdr.Style:=Font^.Style;
- FontHdr.Weight:=Font^.Weight;
- FontHdr.TypeFace:=Font^.TypeFace;
-
- Str(sizeof(tFontHdr):1,NumStr);
- WString:=^[')s'+NumStr+'W';
- MoveToFont(FFile,WString[1],ord(WString[0]));
- MoveToFont(FFile,FontHdr,sizeof(tFontHdr));
-
- for Cn:=0 to MaxChar do
- if Font^.Chars[Cn].ChNbr<>0 then with Font^.Chars[Cn] do
- begin
- CharHdr.C4:=4;
- CharHdr.CNull1:=0;
- CharHdr.C14:=14;
- CharHdr.C1:=1;
- CharHdr.CNull2:=0;
-
- CharHdr.Orient:=Orient;
- CharHdr.LeftOffset:=swap(LeftOffset);
- CharHdr.TopOffset:=swap(TopOffset);
- CharHdr.CWidth:=swap(CWidth);
- CharHdr.CHeight:=swap(CHeight);
- CharHdr.DeltaX:=swap(4*DeltaX);
-
- write(trm,^M^['K',Cn:1);
- Str(Font^.Chars[Cn].ChNbr:1,NumStr);
- WString:=^['*c'+NumStr+'E';
- MoveToFont(FFile,WString[1],ord(Wstring[0]));
-
- Str((sizeof(tCharHdr)+CharLen):1,NumStr);
- WString:=^['(s'+NumStr+'W';
- MoveToFont(FFile,WString[1],ord(Wstring[0]));
-
- MoveToFont(FFile,CharHdr,sizeof(tCharHdr));
- MoveToFont(FFile,CharPtr^,CharLen);
-
- end;
-
- CloseFont(FFile);
- end;
- writeln(trm);
-
-
- end {WriteFont};
-
- procedure RotateChar(
- var CharEnt: tCharEnt);
-
- var
- NCI: Byte;
- NBW: Byte;
- NRI: Byte;
- NCO: Byte;
- NBWO: Byte;
- NRO: Byte;
- Byt: Byte;
- EC: Byte;
- ER: Byte;
- CR: Byte;
- CRB: Byte;
- CC: Byte;
- BC: Byte;
- ColBytes: Integer;
- COff: Integer;
-
- begin {RotateChar}
-
- with CharEnt do
- begin
- NCI:=CWidth;
- NBW:=(NCI+7) shr 3;
- NRI:=CHeight;
-
- COff:=0;
- for CR:=0 to NRI-1 do
- begin
- Move(CharPtr^[COff],ChBits[CR,0],NBW);
- COff:=COff+NBW;
- end;
-
- { for cr:=0 to nri-1 do
- begin
- for cc:=0 to nbw-1 do
- for bc:=0 to 7 do
- if (chbits[cr,cc] and masks[bc])<>0 then
- write(lst,'X')
- else
- write(lst,'.');
- writeln(lst);
- end;
- write(lst,^L);
- }
-
- NCO:=NRI;
- NBWO:=(NCO+7)shr 3;
- NRO:=NCI;
-
- for CR:=0 to NRO-1 do
- FillChar(LChBits[CR,0],NBWO,0);
-
- { for EC:=0 to NBW-1 do
- begin
- CR:=0;
- CC:=EC div 8;
- BC:=EC mod 8;
-
- for ER:=0 to NRI-1 do
- begin
- Byt:=ChBits[ER,EC];
- for CRB:=0 to 7 do
- begin
- if (Byt and Masks[CRB])<>0 then
- LChBits[CR,CC]:=LChBits[CR,CC] or Masks[BC];
- CR:=CR+1;
- end;
- end;
- end;
- }
-
- for EC:=0 to NCI-1 do
- begin
- CC:=EC shr 3;
- BC:=EC and 7;
- for ER:=0 to NRI-1 do
- if (ChBits[ER,CC] and Masks[BC])<>0 then
- LChBits[NCI-EC-1,ER shr 3]:=
- LChBits[NCI-EC-1,ER shr 3] or Masks[ER and 7];
- end;
-
- { for cr:=0 to nro-1 do
- begin
- for cc:=0 to nbwo-1 do
- for bc:=0 to 7 do
- if (lchbits[cr,cc] and masks[bc])<>0 then
- write(lst,'X')
- else
- write(lst,'.');
- writeln(lst);
- end;
- write(lst,^L);
- }
-
- Orient:=1;
- COff:=NCI+LeftOffset-1;
- LeftOffset:= -TopOffset;
- TopOffset:=COff;
- CWidth:=NCO;
- CHeight:=NRO;
-
- FreeMem(CharPtr,CharLen);
- CharLen:=NBWO*NRO;
- GetMem(CharPtr,CharLen);
-
- COff:=0;
- for CR:=0 to NRO-1 do
- begin
- Move(LChBits[CR,0],CharPtr^[COff],NBWO);
- COff:=COff+NBWO;
- end;
-
- end;
-
- end {RotateChar};
-
- procedure RotateFont;
-
- var
- Cn: Byte;
- MaxWidth: Byte;
- RowWidth: Integer;
- R: Byte;
- Iy: Integer;
- Ix: Integer;
-
- begin {RotateFont}
-
- with Font^ do
- begin
- Orient:=1;
-
- for Cn:=0 to MaxChar do
- if Chars[Cn].ChNbr<>0 then
- begin
- RotateChar(Chars[Cn]);
- write(trm,^M^['K',Cn:1);
- end;
-
- writeln(trm);
- end;
-
- end {RotateFont};
-
- begin
-
- DefRegs.Ds:=DSeg;
- DefRegs.Es:=DSeg;
-
- new(Font);
-
- writeln(trm,^J^J^J);
-
- ReadFont;
-
- writeln(trm,'Rotating font.');
- RotateFont;
-
- writeln(trm,'Writing new font.');
- WriteFont;
-
- end.